package com.cskaoyan.java.object._5finalize;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.Scanner;

/**
 * 对象占用的两种资源:
 *      1.对象自身占用的堆内存资源,该资源由Java GC进行垃圾回收释放
 *      2.对象所占用的额外资源,比如操作系统的IO资源,网络资源等
 *          这些资源需要手动进行释放
 * finalize方法是这样设计的:
 *      该方法写在一个类中,随着该类的对象被销毁,finalize方法会立刻执行
 *      只要将释放资源的代码写进finalize方法中,就能够在对象销毁的同时,释放掉额外资源
 *
 * 理想很丰满,现实是很骨感的,Java是做不到这个事情的
 * 因为Java GC销毁对象是具有不确定的,在这段不确定时长的时间里,对象所占用的额外资源仍然未被释放,也就是说在这段时间里,对象明明已经成为垃圾了,已经不需要占用额外资源了
 * 但由于finalize方法未执行,所以额外资源仍然被占用
 * 这显然不行
 *
 * 重点: 以上机制就说明对于Java对象所占用的额外资源,是不能依赖于自动释放的
 * 那么只能去手动释放资源了
 * 在以后的课程中,如果对象占用了额外资源,在用完后,必须手动释放,养成良好的习惯
 *
 * @since 16:32
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws FileNotFoundException {
        /*new Student();
        // 通知GC进行垃圾回收
        System.gc();*/

        Scanner sc = new Scanner(System.in);
        // sc对象就需要占用额外的操作系统IO资源,所以用完了就应该手动释放资源
        int num = sc.nextInt();
        System.out.println(num);
        // 关闭资源
        sc.close();
        // 关了就不能用了
        // String s = sc.nextLine();
    }
}

class Student {
    @Override
    protected void finalize() throws Throwable {
        System.out.println("模拟释放额外资源~~~");
    }
}
